#pragma once
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/async.h"
#include <iostream>

namespace suye
{
// mode - 运行模式：true-发布模式，false-调试模式
std::shared_ptr<spdlog::logger> g_default_logger;
void Init_logger(bool mode, const std::string& file, int level)
{
    // 如果是调试模式，则创建标准输出日志器，输出等级为最低
    if(mode == false)
    {
        g_default_logger = spdlog::stdout_color_mt("default-logger");
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    // 否则是发布模式，则创建文件输出日志器，输出等级为根据参数而定
    else
    {
        g_default_logger = spdlog::basic_logger_mt("file-logger", file);
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));
    }
    g_default_logger->set_pattern("[%n][%H:%M:%S][%-8l] %v");
}

#define LOG_TRACE(format, ...) suye::g_default_logger->trace("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_DEBUG(format, ...) suye::g_default_logger->debug("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_INFO(format, ...) suye::g_default_logger->info("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_WARN(format, ...) suye::g_default_logger->warn("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_ERROR(format, ...) suye::g_default_logger->error("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_FATAL(format, ...) suye::g_default_logger->critical("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__);
}
